////////////////////////////////////////////////
// DESCRIPTION:
//    Custom Emulator UI form
//
// Legal Notices:
//   Copyright (c) 2008, Telliam Consulting, LLC.
//   All rights reserved.
//
//   Redistribution and use in source and binary forms, with or without modification,
//   are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice, this list
//     of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice, this
//     list of conditions and the following disclaimer in the documentation and/or other
//     materials provided with the distribution.
//   * Neither the name of Telliam Consulting nor the names of its contributors may be
//     used to endorse or promote products derived from this software without specific
//     prior written permission.
//
//   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
//   EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
//   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
//   SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
//   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
//   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
//   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
//   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
//   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
//   DAMAGE. 
//
using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace FusionWare.SPOT.EmulatorComponents
{
    /// <summary>Base class for Emulator UI forms that provides implementation of <see cref="IEmulatorComponentControl" /></summary>
    /// <remarks>
    /// You can create new forms derived from this one and use them with your emulator component
    /// derived from the <see cref="CustomEmulator">CustomEmulator</see>
    /// component.
    /// 
    /// If you cannot use this as a base class for some reason (i.e. using an existing custom or
    /// third party form as the base), then you must implement <see cref="IEmulatorComponentControl">IEmulatorComponentControl</see>
    /// on your most derived form type to enable automatic component registration or manually
    /// handle all component registration. 
    /// </remarks>
    public class EmulatorForm : Form, IEmulatorComponentControl
    {
        #region IEmulatorComponentControl Implementation
        /// <summary>Connects the UI to the emulation system</summary>
        /// <param name="Emulator">Emulator to connect the UI to</param>
        /// <remarks>
        /// This method is used to allow the form to register components 
        /// for the controls it contains. 
        /// 
        /// Typically implementations will have GPIOButtons and an LCDControl.
        /// Each control conatins the associated Emulator component, which must
        /// be registered with the emulator in an override of this method.
        /// 
        /// The default implementation scans all child controls and, for any that
        /// support the <see cref="IEmulatorComponentControl" /> interface it
        /// calls <see cref="IEmulatorComponentControl.RegisterComponents"/> to
        /// register any of it's components.
        /// </remarks>
        public void RegisterComponents(CustomEmulator Emulator)
        {
            IEmulatorComponentControlHelper.RegisterComponents(this.Controls, Emulator);
        }
        #endregion
    }
}
